package eight_queen;

/**
 * 八皇后
 */
public class Main {
    // 使用一维数组记录每行放置皇后的位置
    static int[] board = new int[8];
    static int count = 0; // 记录放法

    public static void main(String[] args) {
        put(0); // 第0行开始
        System.out.println(count);
    }

    /**
     * 放置棋子
     * @param row
     */
    public static void put(int row) {
        // 当row大于7时，放置完成
        if (row > 7) {
            count++;
            return;
        }
        // 在该行的8个位置均放置一遍
        for (int i = 0; i < 8; i++) {
            board[row] = i; // 注意：若这里将行和列好号同时传入判断方法判断不太妥当干扰判断
            // 判断放置于该位置是否合法
            if (isLegal(row)) {
                put(row + 1); // 放置下一行的棋子
            }
        }
    }

    /**
     * 判断放置于坐标为board[row]位置的皇后是否合法
     * @param row
     * @return 返回判断结果
     */
    private static boolean isLegal(int row) {
        // 这里判断范围为0到row
        for (int i = 0; i < row; i++) {
            // 判断列和对角线
            // 放置时已经保证了每行只有一个，这里不用判断行是否合法
            if (board[i] == board[row] || Math.abs(i - row) == Math.abs(board[i] - board[row])) {
                return false;
            }
        }
        return true;
    }
}
